package cn.jsj.onclock.dao;

import cn.jsj.onclock.pojo.SignEnt;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author 卢斌
 */
@Mapper
public interface SignDao {


    /**
     * 通过Id查询一条签到信息（详细）
     *
     * @param id    签到Id
     * @return  该条签到信息
     */
    SignEnt getSignEntById(@Param("id") Long id);


    /**
     * 新增一个签到信息实体（除Id以外，参数信息需要对应数据库每一个字段）
     *
     * @param signEnt   签到信息实体
     */
    void insertSignEnt(SignEnt signEnt);


    /**
     * 查询用户发起的签到信息（详细）
     *
     * @param userId    用户Id
     * @return  用户相关的签到信息
     */
    List<SignEnt> listSignEntAboutUser(@Param("userId") Long userId);


    /**
     * 查询和用户以及群组相关的签到信息（详细）
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @return 用户以及群组相关的签到信息
     */
    List<SignEnt> listSignEntAboutUserAndGroup(@Param("userId") Long userId, @Param("groupId") Long groupId);


    /**
     * 查询用户在某一群组从某一时刻到某一时刻发起的签到
     *
     * @param userId    用户Id
     * @param groupId   群组Id
     * @param fromTime  累计开始时间
     * @param untilTime 累计结束时间
     * @return  签到信息
     */
    List<SignEnt> listSignInfoInGroupFromTime(@Param("userId") Long userId, @Param("groupId") Long groupId, @Param("fromTime") Date fromTime, @Param("untilTime") Date untilTime);


    /**
     * 查询一系列的签到来自于那些用户发出的
     *
     * 当signIdList中包含的所有签到均由同一个用户发出，则方法返回该用户Id。当signIdList中的签到由多个用户发出，则将这些签到发出者的用户的Id全部返回。
     *
     * @param signIdList    签到Id列表
     * @return  签到标签Id列表
     */
    List<Long> listSenderOfSign(@Param("idList") List<Long> signIdList);


    /**
     * 查询Id名单中的签到信息
     *
     * @param groupId       群组Id
     * @param signIdList    签到Id列表
     * @return  签到信息
     */
    List<SignEnt> listSignInfoInIdList(@Param("idList") List<Long> signIdList, @Param("groupId") Long groupId);


    /**
     * 查询Id列表名单中，由用户发起的签到信息
     *
     * @param signIdList    签到Id列表
     * @param groupId       群组Id
     * @param sender        签到发起者
     * @return  签到发起者的某签到信息
     */
    List<SignEnt> listSignInfoInIdListFromSender(@Param("idList") List<Long> signIdList, @Param("groupId") Long groupId, @Param("sender") Long sender);


}
